package com.cd.university.service.impl;

import com.cd.university.common.RestResult;
import com.cd.university.service.DictionaryProcessorHolder;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * @author 陈栋
 * @create 2021/11/5 19:15
 */
@Component
public class DictionaryProcessor {

    @Autowired
    private Map<String, DictionaryProcessorHolder> dictionaryProcessorHolderMap;

    /**
     * 执行具体的方法
     * @param type 类的类型
     * @param methodName 方法名称
     * @param data 方法的参数值
     * @param parameterType 方法的参数
     * @return
     */
    public RestResult executeDictionaryMethod(String type,String methodName, Object data, Class<?> parameterType) {
        // 拿到接口在容器中注册的名称
        String interfaceName = type + "Mapper";

        // 通过依赖查找去查找具体的执行类
        DictionaryProcessorHolder processor = dictionaryProcessorHolderMap.get(interfaceName);

        Object result = invokeMethod(processor, data, methodName, parameterType);
        if (result==null) {
            return RestResult.failure("执行方法失败");
        }
        return RestResult.success("执行" + methodName + "字典方法成功")
                .put("data",result);
    }

    /**
     * 执行具体的方法
     * @param processor 具体的Mapper接口类
     * @param data 参数数据
     * @param methodName 方法名称
     * @param parameterType 方法的参数类型
     * @return 执行方法后的返回值
     */
    private Object invokeMethod(DictionaryProcessorHolder processor,
                                Object data,
                                String methodName,
                                Class<?> parameterType) {
        try {
            Method method = null;
            Object invoke = null;

            // 如果方法没有参数
            if (parameterType==null) {
                method = processor.getClass().getMethod(methodName);
                // 执行方法，invoke表示方法的返回值
                invoke = method.invoke(processor);
            }else {
                method = processor.getClass().getMethod(methodName,parameterType);
                // 执行方法，invoke表示方法的返回值
                invoke = method.invoke(processor,data);
            }

            return invoke;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }
}
